//Unit conversion 单位换算 - 长度单位换算

package unitcon

import (
    "errors"
	"strconv"
	"strings"
)

// 定义长度单位转换规则
var graph = map[string]map[string]string{
	"mm": {"in": "25400&/", "um": "1000&*", "mm": "0&n", "cm": "10&/", "dm": "100&/", "m": "1000&/", "km": "1000000&/"},
	"cm": {"in": "2.54&/", "um": "10000&*", "mm": "10&*", "cm": "0&n", "dm": "10&/", "m": "100&/", "km": "100000&/"},
	"dm": {"in": "0.254&/", "um": "100000&*", "mm": "100&*", "cm": "10&*", "dm": "0&n", "m": "10&/", "km": "10000&/"}}

/*
Length 长度单位转换，提供一个原始单位的数值转换成目标长度单位的数值并返回
@param numbe float64 原始单位数值
@param unit string 原始单位 所有长度单位的小写英文缩写如："mm"（毫米）
@param unit2 string 目标单位 所有长度单位的小写英文缩写如："cm"（厘米）
@return res float64,err error
*/
func Length(numbe float64, unit string, unit2 string) (result float64, err error) {

	//转换至不能小于零
	if numbe <= 0 {
		return 0, errors.New("Number cannot be less than zero")
	}

	//检查参数提供的单位是否在规则表中
	if len(graph[unit]) == 0 || graph[unit][unit2] == "" {
		return 0, errors.New("Unable to identify the unit id")
	}

	//处理规则
	str := strings.Split(graph[unit][unit2], "&")
	a2, _ := strconv.ParseFloat(str[0], 2)

	//换算并返回
	switch {
	case str[1] == "/":
		return numbe / a2, nil
	case str[1] == "*":
		return numbe * a2, nil
	case str[1] == "n":
		return numbe, nil
	}

	return 0, nil
}
